package com.andy.rpc.handler;

import com.andy.rpc.RpcRequest;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

import java.util.concurrent.Callable;

public class ClientHandler  extends ChannelInboundHandlerAdapter implements Callable {

    //定义成员变量
    private ChannelHandlerContext context; //事件处理器上下文对象 (存储handler信息,写操作)
    private Object result; // 记录服务器返回的数据
    private RpcRequest param; //记录将要返送给服务器的数据

    //设置参数方法
    public void setParam(RpcRequest rpcRequest){
        this.param=rpcRequest;
    }

    //1.连接成功时（初始化），获取ChannelHandlerContext
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        this.context=ctx;
    }

    //2.将客户端的请求写到服务器，然后线程挂起，直到异步读取到写入，再被唤醒并返回结果
    @Override
    public synchronized Object call() throws Exception {
        context.writeAndFlush(param);
        //挂起，等待异步唤醒
        wait();
        return result;
    }

    //3.客户端channel读到数据，则将拿到的数据作为result保存给本地变量，并唤醒挂起的call方法
    @Override
    public synchronized void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        result = msg;
        notify();
    }
}
